//package cn.com.w.ratelimiter.util;
//
//import com.google.common.util.concurrent.RateLimiter;
//import com.koolearn.clue.sea.config.AppConfig;
//import org.apache.commons.lang3.time.DateFormatUtils;
//import org.apache.commons.lang3.time.DateUtils;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//
//import java.text.ParseException;
//import java.util.Date;
//
//
///**
// * @ClassName RateLimiterUtil
// * @Description: 限流工具类，只限制一台机器的数量
// * @Author lili
// * @Date 2020/6/17
// */
//public class RateLimiterUtil {
//
//    private final static Logger Logger =  LoggerFactory.getLogger(RateLimiterUtil.class);
//
//    public static final String DATE_FORMAT_24 = "yyyy-MM-dd HH:mm:ss";
//
//    public static final String DATE_FORMAT_DAY = "yyyy-MM-dd ";
//
//    /**
//     * 线索分配 默认：每秒只发出5个令牌
//     */
//    public static RateLimiter disRateLimiter = RateLimiter.create(AppConfig.getDisRateLimiterQPS());
//
//
//    /**
//     * 大数据更新线索评分 默认：每秒只发出5个令牌
//     */
//    public static RateLimiter bigRateLimiter = RateLimiter.create(AppConfig.getBigScoreRateLimiterQPS());
//    public static RateLimiter bigRateLimiter4InvalidTime = RateLimiter.create(AppConfig.getBigScoreRateLimiterQPS4InvalidTime());
//
//    /**
//     * 销售活动意向创建 默认：每秒只发出5个令牌
//     */
//    public static RateLimiter createIntentionLimiter = RateLimiter.create(AppConfig.getCreateIntentionRateLimiterQPS());
//
//    /**
//     * 规则修改线索匹配 默认：每秒只发出1个令牌
//     */
//    public static RateLimiter ruleModifyClueMatchRateLimiter = RateLimiter.create(AppConfig.getRuleModifyClueMatchRateLimiterQPS());
//
//    /**
//     * 创建线索 默认：每秒只发出20个令牌
//     */
//    public static RateLimiter createClueRateLimiter = RateLimiter.create(AppConfig.getCreateClueRateLimiterQPS());
//
//    /**
//     * 创建线索 默认：每秒只发出20个令牌
//     */
//    public static RateLimiter clueAutoDistributeRateLimiter = RateLimiter.create(AppConfig.getClueAutoDistributeLimiterQPS());
//
//    /**
//     * 即将回收限流器 默认：每秒只发出50个令牌
//     */
//    public static RateLimiter futureRecycleRateLimiter = RateLimiter.create(AppConfig.getFutureRecycleRateLimiterQPS());
//
//    /**
//     * 即将回收限流器-规则修改 默认：每秒只发出50个令牌
//     */
//    public static RateLimiter futureRecycle4ModifyRuleRateLimiter = RateLimiter.create(AppConfig.getFutureRecycle4ModifyRuleRateLimiterQPS());
//
//    /**
//     * 即将回收限流器-变更线索评分 默认：每秒只发出50个令牌
//     */
//    public static RateLimiter futureRecycle4ChangeScoreRateLimiter = RateLimiter.create(AppConfig.getFutureRecycle4ChangeScoreRateLimiterQPS());
//
//    /**
//     * 线索分配尝试获取令牌，true-可以通过 false-不通过
//     * @return
//     */
//    public static boolean disTryAcquire() {
//        boolean canPass = true;
//        try {
//            double rate = disRateLimiter.getRate();
//            //不限速
//            if (AppConfig.getDisRateLimiterSwitch().equals("0")){
//                Logger.info("====>RateLimiterUtil disTryAcquire not limit!");
//                return canPass;
//            }
//            //获取到许可
//            if (disRateLimiter.tryAcquire()) {
//                Logger.info("====>RateLimiterUtil disTryAcquire tryAcquire pass! rate={}", rate);
//            } else {
//                Logger.info("====>RateLimiterUtil disTryAcquire tryAcquire not pass! rate={}", rate);
//                canPass = false;
//            }
//        } catch (Exception e) {
//            Logger.error("====>RateLimiterUtil disTryAcquire Exception!", e);
//        }
//        return canPass;
//    }
//
//    /**
//     * 获取处理大数据评分分令牌
//     *
//     * @return
//     */
//    public static boolean bigScoreTryAcquire() {
//        boolean canPass = true;
//        try {
//            double rate = 0.0d;
//            // 先判断合法的时间区间,合法-走正常的限流器，不合法-走非法时间的限流器
//            boolean validTime = betweenStartTimeAndEndTime(AppConfig.getBigScoreRateLimiterStartTime(),AppConfig.getBigScoreRateLimiterEndTime());
//            if(validTime){
//                rate = bigRateLimiter.getRate();
//                // 获取到许可
//                if (bigRateLimiter.tryAcquire()) {
//                    Logger.info("====>RateLimiterUtil bigScoreTryAcquire tryAcquire pass! rate={}", rate);
//                } else {
//                    Logger.info("====>RateLimiterUtil bigScoreTryAcquire tryAcquire not pass! rate={}", rate);
//                    canPass = false;
//                }
//            } else {
//                rate = bigRateLimiter4InvalidTime.getRate();
//                // 获取到许可
//                if (bigRateLimiter4InvalidTime.tryAcquire()) {
//                    Logger.info("====>RateLimiterUtil bigScoreTryAcquire tryAcquire pass! rate={}", rate);
//                } else {
//                    Logger.info("====>RateLimiterUtil bigScoreTryAcquire tryAcquire not pass! rate={}", rate);
//                    canPass = false;
//                }
//            }
//        } catch (Exception e) {
//            Logger.error("====>RateLimiterUtil bigScoreTryAcquire Exception!", e);
//        }
//        return canPass;
//    }
//
//    /**
//   * 是否在是开始时间和结束时间之间
//   * @param startTime 开始时间 例如 09:00:00
//   * @param endTime 结束时间 例如 23:00:00
//   * @return
//   */
//    public static boolean betweenStartTimeAndEndTime(String startTime, String endTime) {
//       try {
//            Long currentTimeMillis = System.currentTimeMillis();
//            String dailyStart = DateFormatUtils.format(currentTimeMillis, DATE_FORMAT_DAY.concat(startTime));
//            String dailyEnd = DateFormatUtils.format(currentTimeMillis, DATE_FORMAT_DAY.concat(endTime));
//            Date currDate = new Date(currentTimeMillis);
//            //判断是否在指定时间内
//            if (currDate.after(DateUtils.parseDate(dailyStart, DATE_FORMAT_24))
//                    && currDate.before(DateUtils.parseDate(dailyEnd, DATE_FORMAT_24))) {
//                return true;
//            }
//        } catch (ParseException e) {
//            Logger.error("betweenStartTimeAndEndTime ParseException", e);
//        }
//        Logger.info("====>RateLimiterUtil bigScoreTryAcquire limit not betweenStartTimeAndEndTime!");
//        return false;
//    }
//
//    /**
//     * 意向创建是否获取到令牌 true-可以通过 false-不通过
//     * @return
//     */
//    public static boolean createIntentionTryAcquire() {
//        boolean canPass = true;
//        try {
//            double rate = createIntentionLimiter.getRate();
//            //不限速
//            if (AppConfig.getCreateIntentionRateLimiterSwitch().equals("0")){
//                Logger.info("====>RateLimiterUtil createIntentionTryAcquire not limit!");
//                return canPass;
//            }
//
//            //获取到许可
//            if (createIntentionLimiter.tryAcquire()) {
//                Logger.info("====>RateLimiterUtil createIntentionTryAcquire tryAcquire pass! rate={}", rate);
//            } else {
//                Logger.info("====>RateLimiterUtil createIntentionTryAcquire tryAcquire not pass! rate={}", rate);
//                canPass = false;
//            }
//        } catch (Exception e) {
//            Logger.error("====>RateLimiterUtil createIntentionTryAcquire Exception!", e);
//        }
//        return canPass;
//    }
//
//
//    /**
//     * 规则修改线索重新匹配尝试获取令牌，true-可以通过 false-不通过
//     *
//     * @return
//     */
//    public static boolean ruleModifyClueMatchTryAcquire() {
//        try {
//            // 不限速
//            if (AppConfig.getRuleModifyClueMatchRateLimiterSwitch().equals("0")) {
//                Logger.info("====>RateLimiterUtil ruleModifyClueMatchTryAcquire not limit!");
//                return true;
//            }
//            double rate = ruleModifyClueMatchRateLimiter.getRate();
//            // 获取到许可
//            if (ruleModifyClueMatchRateLimiter.tryAcquire()) {
//                Logger.info("====>RateLimiterUtil ruleModifyClueMatchTryAcquire tryAcquire pass! rate={}", rate);
//            } else {
//                Logger.info("====>RateLimiterUtil ruleModifyClueMatchTryAcquire tryAcquire not pass! rate={}", rate);
//                return false;
//            }
//        } catch (Exception e) {
//            Logger.error("====>RateLimiterUtil ruleModifyClueMatchTryAcquire Exception!", e);
//        }
//        return true;
//    }
//
//
//    /**
//     * 大数据得分是否获取到令牌 true-可以通过 false-不通过
//     * @return
//     */
//    public static boolean createClueTryAcquire() {
//        if(!AppConfig.getCreateClueRateLimiterSwitch()){
//            return true;
//        }
//        boolean canPass = true;
//        try {
//            double rate = createClueRateLimiter.getRate();
//            //获取到许可
//            if (createClueRateLimiter.tryAcquire()) {
//                Logger.info("====>RateLimiterUtil createClueTryAcquire tryAcquire pass! rate={}", rate);
//            } else {
//                Logger.info("====>RateLimiterUtil createClueTryAcquire tryAcquire not pass! rate={}", rate);
//                canPass = false;
//            }
//        } catch (Exception e) {
//            Logger.error("====>RateLimiterUtil createClueTryAcquire Exception!", e);
//        }
//        return canPass;
//    }
//
//    /**
//     * 获取线索自动分配令牌
//     *
//     * @return
//     */
//    public static boolean getClueAutoDistributeTryAcquire() {
//        try {
//            double rate = clueAutoDistributeRateLimiter.getRate();
//            // 获取到许可
//            if (clueAutoDistributeRateLimiter.tryAcquire()) {
//                Logger.info("====>RateLimiterUtil clueAutoDistributeTryAcquire tryAcquire pass! rate={}", rate);
//                return true;
//            } else {
//                Logger.info("====>RateLimiterUtil clueAutoDistributeTryAcquire tryAcquire not pass! rate={}", rate);
//                return false;
//            }
//        } catch (Exception e) {
//            Logger.error("====>RateLimiterUtil clueAutoDistributeTryAcquire Exception!", e);
//        }
//        return true;
//    }
//
//
//    /**
//     * 即将回收消息处理令牌 true-可以通过 false-不通过
//     * @return
//     */
//    public static boolean createFutureRecycleAcquire() {
//        boolean canPass = true;
//        try {
//            double rate = futureRecycleRateLimiter.getRate();
//            //获取到许可
//            if (futureRecycleRateLimiter.tryAcquire()) {
//                Logger.info("====>RateLimiterUtil createFutureRecycleAcquire tryAcquire pass! rate={}", rate);
//            } else {
//                Logger.info("====>RateLimiterUtil createFutureRecycleAcquire tryAcquire not pass! rate={}", rate);
//                canPass = false;
//            }
//        } catch (Exception e) {
//            Logger.error("====>RateLimiterUtil createFutureRecycleAcquire Exception!", e);
//        }
//        return canPass;
//    }
//
//    /**
//     * 即将回收规则修改消息处理令牌 true-可以通过 false-不通过
//     * @return
//     */
//    public static boolean createFutureRecycle4ModifyRuleAcquire() {
//        boolean canPass = true;
//        try {
//            double rate = futureRecycle4ModifyRuleRateLimiter.getRate();
//            //获取到许可
//            if (futureRecycle4ModifyRuleRateLimiter.tryAcquire()) {
//                Logger.info("====>RateLimiterUtil createFutureRecycle4ModifyRuleAcquire tryAcquire pass! rate={}", rate);
//            } else {
//                Logger.info("====>RateLimiterUtil createFutureRecycle4ModifyRuleAcquire tryAcquire not pass! rate={}", rate);
//                canPass = false;
//            }
//        } catch (Exception e) {
//            Logger.error("====>RateLimiterUtil createFutureRecycle4ModifyRuleAcquire Exception!", e);
//        }
//        return canPass;
//    }
//
//    /**
//     * 即将回收-变更线索分消息处理令牌 true-可以通过 false-不通过
//     * @return
//     */
//    public static boolean createFutureRecycle4ChangeScoreAcquire() {
//        boolean canPass = true;
//        try {
//            double rate = futureRecycle4ChangeScoreRateLimiter.getRate();
//            //获取到许可
//            if (futureRecycle4ChangeScoreRateLimiter.tryAcquire()) {
//                Logger.info("====>RateLimiterUtil createFutureRecycle4ChangeScoreAcquire tryAcquire pass! rate={}", rate);
//            } else {
//                Logger.info("====>RateLimiterUtil createFutureRecycle4ChangeScoreAcquire tryAcquire not pass! rate={}", rate);
//                canPass = false;
//            }
//        } catch (Exception e) {
//            Logger.error("====>RateLimiterUtil createFutureRecycle4ChangeScoreAcquire Exception!", e);
//        }
//        return canPass;
//    }
//}
